/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package comp.racer.rn;

import comp.racer.common.rn.CompRacerException;
import comp.racer.common.rn.Jogador;
import comp.racer.so.Servidor;
import java.util.List;
import java.util.Map;
import java.util.Vector;

/**
 *
 * @author david
 */
public class SalaDeEspera {

    private final int LOTACAO = 4;

    private boolean todosJogadoresPraparados = false;
    private boolean acessivel = true;

    public SalaDeEspera() {

    }

    public Jogador validaEntradaJogador(String clienteLogin) throws CompRacerException {

        System.out.println("\nSalaDeEspera: tentativa de validar entrada do jogador " + clienteLogin);

        if (getLoginJogadorMap().containsKey(clienteLogin)) {
            System.out.println("SalaDeEspera: Jogador " + clienteLogin + " jah existe na sala. Tentativa de entrada nao validada");
            throw new CompRacerException("Jogador com o mesmo login já existente");
        }

        if (getLoginJogadorMap().size() == LOTACAO) {
            System.out.println("SalaDeEspera: Sala Lotada!");
            throw new CompRacerException("Sala de Espera lotada");
            
        }

        Jogador jogadorValidado = new Jogador(clienteLogin);

        getLoginJogadorMap().put(clienteLogin, jogadorValidado);

        System.out.println("\nSalaDeEspera: Entrada Validada para " + clienteLogin);
        return jogadorValidado;

    }

    public Jogador alteraEstado(String clienteLogin) {

        Jogador jogadorAtualizado = getLoginJogadorMap().get( clienteLogin );
        System.out.println("SalaDeEspera: alteraEstado" + jogadorAtualizado);

        jogadorAtualizado.setEstado(Jogador.PREPARADO);
        System.out.println("Jogador atualizado: " + jogadorAtualizado);

        setTodosJogadoresPraparados(true);

        for (Jogador loopJogador : getLoginJogadorMap().values()) {
            if(loopJogador.getEstado() == Jogador.N_PREPARADO)
                setTodosJogadoresPraparados(false);
        }

        if(isTodosJogadoresPraparados())
            setAcessivel(false);

        return jogadorAtualizado;

    /*        Altera estado
    Assinatura do Método: alteraEstado(Jogador jogador)
    Lógica da Responsabilidade: Altera o estado de um determinado jogador para “preparado”. Caso todos os
     jogadores estejam preparados, a partida é iniciada.
    [RN-SalaDeEspera, Sabe jogadores]
    [RN-SalaDeEspera, Inicia Partida]
     */

    }

    public List<Jogador> getJogadores() {
        return new Vector<Jogador>(getLoginJogadorMap().values());
    }

    public Map<String, Jogador> getLoginJogadorMap() {
        return Servidor.getInstancia().getLoginJogadorMap();

    }

    public void setLoginJogadorMap(Map<String, Jogador> loginJogadorMap) {
        Servidor.getInstancia().setLoginJogadorMap(loginJogadorMap);
    }

    public boolean isTodosJogadoresPraparados() {
        return todosJogadoresPraparados;
    }

    public void setTodosJogadoresPraparados(boolean todosJogadoresPraparados) {
        this.todosJogadoresPraparados = todosJogadoresPraparados;
    }

    public boolean isAcessivel() {
        return acessivel;
    }

    public void setAcessivel(boolean acessivel) {
        this.acessivel = acessivel;
    }

    
}
